/* Copyright 2017 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. TWRP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TWRP. If not, see . */ // pages.hpp - Base classes for page manager of GUI #ifndef _PAGES_HEADER_HPP #define _PAGES_HEADER_HPP #include "../zipwrap.hpp" #include #include #include #include "rapidxml.hpp" #include "gui.hpp" using namespace rapidxml; enum TOUCH_STATE { TOUCH_START = 0, TOUCH_DRAG = 1, TOUCH_RELEASE = 2, TOUCH_HOLD = 3, TOUCH_REPEAT = 4 }; struct COLOR { unsigned char red; unsigned char green; unsigned char blue; unsigned char alpha; COLOR() : red(0), green(0), blue(0), alpha(0) {} COLOR(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255) : red(r), green(g), blue(b), alpha(a) {} }; struct language_struct { std::string filename; std::string displayvalue; }; inline bool operator < (const language_struct& language1, const language_struct& language2) { return language1.displayvalue < language2.displayvalue; } extern std::vector Language_List; // Utility Functions int ConvertStrToColor(std::string str, COLOR* color); int gui_forceRender(void); int gui_changePage(std::string newPage); int gui_changeOverlay(std::string newPage); class Resource; class ResourceManager; class RenderObject; class ActionObject; class InputObject; class MouseCursor; class GUIObject; class HardwareKeyboard; class Page { public: Page(xml_node<>* page, std::vector*> *templates); virtual ~Page(); std::string GetName(void) { return mName; } public: virtual int Render(void); virtual int Update(void); virtual int NotifyTouch(TOUCH_STATE state, int x, int y); virtual int NotifyKey(int key, bool down); virtual int NotifyCharInput(int ch); virtual int SetKeyBoardFocus(int inFocus); virtual int NotifyVarChange(std::string varName, std::string value); virtual void SetPageFocus(int inFocus); protected: std::string mName; std::vector mObjects; std::vector mRenders; std::vector mActions; std::vector mInputs; ActionObject* mTouchStart; COLOR mBackground; protected: bool ProcessNode(xml_node<>* page, std::vector*> *templates, int depth); }; struct LoadingContext; class PageSet { public: PageSet(); virtual ~PageSet(); public: int Load(LoadingContext& ctx, const std::string& filename); int LoadLanguage(char* languageFile, ZipWrap* package); void MakeEmergencyConsoleIfNeeded(); Page* FindPage(std::string name); int SetPage(std::string page); int SetOverlay(Page* page); const ResourceManager* GetResources(); // Helper routine for identifing if we're the current page int IsCurrentPage(Page* page); std::string GetCurrentPage() const; // These are routing routines int Render(void); int Update(void); int NotifyTouch(TOUCH_STATE state, int x, int y); int NotifyKey(int key, bool down); int NotifyCharInput(int ch); int SetKeyBoardFocus(int inFocus); int NotifyVarChange(std::string varName, std::string value); void AddStringResource(std::string resource_source, std::string resource_name, std::string value); protected: int LoadDetails(LoadingContext& ctx, xml_node<>* root); int LoadPages(LoadingContext& ctx, xml_node<>* pages); int LoadVariables(xml_node<>* vars); protected: ResourceManager* mResources; std::vector mPages; Page* mCurrentPage; std::vector mOverlays; // Special case for popup dialogs and the lock screen }; class PageManager { public: // Used by GUI static char* LoadFileToBuffer(std::string filename, ZipWrap* package); static void LoadLanguageList(ZipWrap* package); static void LoadLanguage(std::string filename); static int LoadPackage(std::string name, std::string package, std::string startpage); static PageSet* SelectPackage(std::string name); static int ReloadPackage(std::string name, std::string package); static void ReleasePackage(std::string name); static int RunReload(); static void RequestReload(); static void SetStartPage(const std::string& page_name); // Used for actions and pages static int ChangePage(std::string name); static int ChangeOverlay(std::string name); static const ResourceManager* GetResources(); static std::string GetCurrentPage(); // Helper to identify if a particular page is the active page static int IsCurrentPage(Page* page); // These are routing routines static int Render(void); static int Update(void); static int NotifyTouch(TOUCH_STATE state, int x, int y); static int NotifyKey(int key, bool down); static int NotifyCharInput(int ch); static int SetKeyBoardFocus(int inFocus); static int NotifyVarChange(std::string varName, std::string value); static MouseCursor *GetMouseCursor(); static void LoadCursorData(xml_node<>* node); static HardwareKeyboard *GetHardwareKeyboard(); static xml_node<>* FindStyle(std::string name); static void AddStringResource(std::string resource_source, std::string resource_name, std::string value); protected: static PageSet* FindPackage(std::string name); static void LoadLanguageListDir(std::string dir); static void Translate_Partition(const char* path, const char* resource_name, const char* default_value); static void Translate_Partition(const char* path, const char* resource_name, const char* default_value, const char* storage_resource_name, const char* storage_default_value); static void Translate_Partition_Display_Names(); protected: static std::map mPageSets; static PageSet* mCurrentSet; static MouseCursor *mMouseCursor; static HardwareKeyboard *mHardwareKeyboard; static bool mReloadTheme; static std::string mStartPage; static LoadingContext* currentLoadingContext; }; #endif // _PAGES_HEADER_HPP